--[[ Изменения script_version: 3 - сохранение поля job_online 5 - сохранение поля was_in_smart_terrain 6 - сохранение поля death_droped ]] class "se_stalker" (cse_alife_human_stalker) -------------------- function se_stalker:__init (section) super (section) db.offline_objects[self.id] = empty_table(db.offline_objects[self.id]) end -------------------- function se_stalker:can_switch_offline() if self.group_id ~= 65535 then return true end return cse_alife_human_stalker.can_switch_offline(self) end -------------------- function se_stalker:can_switch_online() return cse_alife_human_stalker.can_switch_online(self) -- if self.group_id ~= 65535 then -- return true -- end -- return false end function se_stalker:switch_online() --utils_data.debug_write(strformat("se_stalker:switch_online %s",self:name())) cse_alife_human_stalker.switch_online(self) end function se_stalker:switch_offline() cse_alife_human_stalker.switch_offline(self) end -------------------- function se_stalker:STATE_Write(packet) --utils_data.debug_write(strformat("%s STATE_Write alive=%s",self:name(),self:alive())) cse_alife_human_stalker.STATE_Write (self, packet) if self.online then packet:w_stringZ(tostring(level and level.object_by_id(self.id) and level.object_by_id(self.id):level_vertex_id())) else packet:w_stringZ(tostring(db.offline_objects[self.id] and db.offline_objects[self.id].level_vertex_id)) end packet:w_stringZ(tostring(db.offline_objects[self.id] and db.offline_objects[self.id].active_section)) packet:w_bool(false) -- self.death_droped end -------------------- function se_stalker:STATE_Read(packet, size) --utils_data.debug_write("\nse_stalker:STATE_Read "..self:name().." START") cse_alife_human_stalker.STATE_Read (self, packet, size) if self.script_version > 10 then local old_lvid = packet:r_stringZ() if db.offline_objects[self.id] == nil then db.offline_objects[self.id] = {} end db.offline_objects[self.id].active_section = packet:r_stringZ() if db.offline_objects[self.id].active_section == "nil" then db.offline_objects[self.id].active_section = nil end if old_lvid ~= "nil" then db.offline_objects[self.id].level_vertex_id = tonumber(old_lvid) end end packet:r_bool() -- self.death_droped = packet:r_bool() --utils_data.debug_write("se_stalker:STATE_Read "..self:name().." END\n") end -------------------- function se_stalker:on_before_register() end -------------------- function se_stalker:on_register() --utils_data.debug_write("\nse_stalker:on_register "..self:name().." START") cse_alife_human_stalker.on_register( self ) SendScriptCallback("server_entity_on_register",self,"se_stalker") -- persistent storage --alife_storage_manager.get_se_obj_state(self,true) -- Проверяем кастомдату обьекта на наличие стори айди. --story_objects.check_spawn_ini_for_story_id(self) if db.offline_objects[self.id] == nil then db.offline_objects[self.id] = {} end -- db.offline_objects[self.id].level_vertex_id = self.m_level_vertex_id --printf("registering stalker %s ", self:name()) --' Отключаем старый метод выбора смарттеррейнов. self:brain():can_choose_alife_tasks(false) --' Выбор смарта local spawn_ini = self:spawn_ini() local smartn = spawn_ini and spawn_ini:r_string_ex("logic","smart_terrain") local smart = smartn and SIMBOARD:get_smart_by_name(smartn) if (smart) then smart:register_npc(self) end --utils_data.debug_write("se_stalker:on_register "..self:name().." END") end -------------------- function se_stalker:on_unregister() --utils_data.debug_write("se_stalker:on_unregister()") local strn_id = self:smart_terrain_id() if strn_id ~= 65535 then local smart = alife_object(strn_id) if smart ~= nil then smart:unregister_npc(self) end end db.offline_objects[self.id] = nil -- If object unregisters before saving, it means it was removed from game --alife_storage_manager.get_state().se_object[self.id] = nil SendScriptCallback("server_entity_on_unregister",self,"se_stalker") cse_alife_human_stalker.on_unregister(self) end -------------------- function se_stalker:on_spawn() cse_alife_human_stalker.on_spawn(self) -- Alundaio SendScriptCallback("se_stalker_on_spawn",self) -- Alundaio end -------------------- function se_stalker:on_death(killer) --utils_data.debug_write(strformat("se_stalker:on_death %s killer=%s",self:name(),killer and killer:name())) cse_alife_human_stalker.on_death(self, killer) smart_terrain.on_death(self) local squad = self.group_id and self.group_id < 65535 and alife_object(self.group_id) if (squad) then squad:on_npc_death(self,killer) end if (level.map_has_object_spot(self.id,"red_location") == 1) then level.map_remove_object_spot(self.id, "red_location") end end -------------------- function se_stalker:update() if not self.first_update then self.first_update = true end cse_alife_human_stalker.update(self) end --'Торговец class "se_trader" (cse_alife_trader) function se_trader:__init (section) super (section) end function se_trader:on_register() --story_objects.check_spawn_ini_for_story_id(self) SendScriptCallback("server_entity_on_register",self,"se_trader") cse_alife_trader.on_register(self) end function se_trader:on_unregister() --unregister_story_object_by_id(self.id) SendScriptCallback("server_entity_on_unregister",self,"se_trader") cse_alife_trader.on_unregister(self) end function se_trader:keep_saved_data_anyway() return true end